home *** CD-ROM | disk | FTP | other *** search
/ MIDICraft's MIDINET CD-ROM / MIDICraft's MIDINET CD-ROM.iso / DOSUTILS / MAPNOTES.ZIP / MIDIIO.HPP < prev   
C/C++ Source or Header  |  1997-03-11  |  15KB  |  463 lines

  1. #ifndef __MIDIIO__
  2. #define __MIDIIO__
  3.  
  4. #include <stdio.h>
  5.  
  6. #ifndef MIDI_BUFSIZE
  7. #define MIDI_BUFSIZE  1024
  8. #endif
  9.  
  10. #ifdef __MSDOS__
  11. #define __PC__
  12. #endif
  13.  
  14. // opening modes of a midi file
  15. #ifdef __PC__     // define this symbol if you compile on a PC
  16. #define WRITE_BINARY  "wb"
  17. #define READ_BINARY   "rb"
  18. #else
  19. #define WRITE_BINARY  "w"
  20. #define READ_BINARY   "r"
  21. #endif
  22.  
  23. const unsigned long MThd = 0x4D546864ul;
  24. const unsigned long MTrk = 0x4D54726Bul;
  25.  
  26. // different standard midi formats
  27. #define VERSION_MULTICHANNEL   0
  28. #define VERSION_SINGLECHANNEL  1
  29. #define VERSION_MULTISONG      2
  30.  
  31. #define OPTION_NOCONTROLS   1    // no control details but general information
  32. #define OPTION_NOEVENTS     2    // no track events at all
  33. #define OPTION_NOMETAEVENTS 4    // no meta details but general information
  34. #define OPTION_NOSYSEVENTS  8    // no sysex details but general information
  35. #define OPTION_NONOTEEVENTS 16   // no note events (8x or 9x)
  36. #define OPTION_NOPOLYEVENTS 32   // no poly aftertouch events (Ax)
  37. #define OPTION_NOCONTROLEVENTS 64 // no control events at all (Bx)
  38. #define OPTION_NOPROGRAMEVENTS 128 // no program change events (Cx)
  39. #define OPTION_NOAFTERTOUCHEVENTS 256 // no aftertouch events (Dx)
  40. #define OPTION_NOPITCHBENDEVENTS 512 // no pitchbend events (Ex)
  41. #define OPTION_NOREALTIMEEVENTS  1024 // no realtime events (Fx)
  42.  
  43. // getchannel delivers a valid channel or:
  44. #define NOCHANNEL     (-1)
  45. #define MULTICHANNEL  (-2)
  46. #define VALIDCHANNEL(ch)  ((ch) >= 0 && (ch) <= 15)
  47. #define gm_drumchannel 9
  48. #define SAYCHANNEL(ch)  ((ch) + 1) // 0..15 in midi format but spoken 1..16!
  49.  
  50. // for use of param what in function text()
  51. #define meta_text       1
  52. #define meta_copyright  2
  53. #define meta_trackname  3
  54. #define meta_instrument 4
  55. #define meta_lyric    5
  56. #define meta_marker    6
  57. #define meta_cuepoint    7
  58. #define meta_endtrack   0x2f
  59.  
  60. #define ctrl_highbank 0
  61. #define ctrl_wheel 1
  62. #define ctrl_breath 2
  63. #define ctrl_foot 4
  64. #define ctrl_portamentotime 5
  65. #define ctrl_data 6
  66. #define ctrl_volume 7
  67. #define ctrl_balance 10
  68. #define ctrl_expression 11
  69. #define ctrl_lowbank 32
  70. #define ctrl_hold 64
  71. #define ctrl_reverb 91
  72. #define ctrl_chorus 93
  73. #define ctrl_datainc 96
  74. #define ctrl_datadec 97
  75. #define ctrl_lowrpn  100
  76. #define ctrl_highrpn 101
  77.  
  78. #define balance_left   0
  79. #define balance_center 64
  80. #define balance_right  127
  81.  
  82. #define volume_mute    0
  83. #define volume_full    127
  84.  
  85. #define bpm(ticks)     (60000000.0 / (ticks))
  86. #define ticks(beats)   ((unsigned long)(60000000.0 / (beats)))
  87.  
  88. #define tempo_60bpm    (1000000L)
  89. #define tempo_120bpm   (500000L)
  90. #define tempo_240bpm   (250000L)
  91.  
  92. #define pitchbend_maxdown  0x0000
  93. #define pitchbend_center   0x2000
  94. #define pitchbend_maxup    0x3fff
  95.  
  96. #define MIDI_PRELOAD  1
  97. #define MIDI_DIRECTIO 0
  98.  
  99. #define NOTREALISTIC_PAUSE 0x1000000UL
  100.  
  101. class MidiBuffer
  102. {
  103. public:
  104.   MidiBuffer(const char* filename, FILE* f = 0, char preload = MIDI_DIRECTIO);
  105.   MidiBuffer(unsigned char* mididata, long mididatalen, char shouldfree = 0);
  106.   virtual ~MidiBuffer();
  107.  
  108.   FILE* getf();
  109.   long midilength();  // > 0 if buffer contains data
  110.  
  111.   int need(long pos, unsigned char* buf, int bufsize); // bufsize must be kb aligned!
  112.  
  113. protected:
  114.   const char *midiname_;
  115.   FILE* f_;
  116.   unsigned char* midibuf_;
  117.   char shouldfreemidibuf_;    // 0=no, otherwise=yes
  118.  
  119.   unsigned char shouldclose_; // 0=no, otherwise=yes
  120.   long filesize_;
  121. };
  122.  
  123. class MidiRead : public MidiBuffer
  124. {
  125. public:
  126.   static const char* copyright();
  127.  
  128.   MidiRead(const char* filename, FILE* f = 0, char preload = 0);
  129.   virtual ~MidiRead();
  130.  
  131.   long seekmidihead(); // returns pos >= 0 if midi header found and seeks to header
  132.  
  133.   virtual int run();
  134.   virtual int runhead();
  135.   virtual int runtrack(int trackno);
  136.   virtual int runevent(long trackend);
  137.  
  138.   long getpos() { return pos_; }
  139.   long geteventpos() { return pos_; }
  140.   long getcurpos() { return curpos_; }
  141.   unsigned long getcurunit() { return curunit_; } // in midi units
  142.   unsigned long getcurmillisec() { return curms_; } // milliseconds
  143.     // Warning: getcurmillisec() only valid in first track and not using
  144.     // OPTION_NOREALTIMEEVENTS or OPTION_NOMETAEVENTS
  145.   unsigned long getcurbeat() { return unitsperbeat_ > 0 ? curunit_ / unitsperbeat_ : 0; }
  146.  
  147.   virtual void head(unsigned version, unsigned tracks, unsigned unitperbeat);
  148.   virtual void track(int trackno, long length, int channel);
  149.   virtual void endtrack(int trackno); // closing track
  150.  
  151.   virtual void time(unsigned long ticks); // delay between events
  152.  
  153.   virtual void event(int what, int len = 0, unsigned char* data = 0);
  154.  
  155.   // these are event categories:
  156.     virtual void meta(int what, int len, unsigned char* data);
  157.     // these are special meta events:
  158.       virtual void text(int what, int len, char* whattext, unsigned char* txt);
  159.       virtual void end();  // end of track command
  160.       virtual void prefixchannel(unsigned char channel);
  161.       virtual void prefixport(unsigned char port);
  162.       virtual void seqnumber(unsigned int seqno);
  163.       virtual void smpteofs(int hour, int min, int sec, int frame, int fracframe);
  164.       virtual void tact(int nom, int denom, int unitsperbeat, int notes32perbeat);
  165.       virtual void tempo(unsigned long microsecperbeat);
  166.       virtual void key(int signature, int isminor); // C=0, -7=7flats +7=7sharps
  167.     virtual void program(int channel, int prg);
  168.     virtual void control(int channel, int what, int val); // general controls
  169.     // special controls:
  170.       virtual void highbank(int channel, int val);
  171.       virtual void wheel(int channel, int val);
  172.       virtual void breath(int channel, int val);
  173.       virtual void foot(int channel, int val);
  174.       virtual void portamentotime(int channel, int val);
  175.       virtual void data(int channel, int val);
  176.       virtual void volume(int channel, int val);
  177.       virtual void balance(int channel, int val);
  178.       virtual void expression(int channel, int val);
  179.       virtual void lowbank(int channel, int val);
  180.       virtual void hold(int channel, int val);
  181.       virtual void reverb(int channel, int val);
  182.       virtual void chorus(int channel, int val);
  183.       virtual void datainc(int channel, int val);
  184.       virtual void datadec(int channel, int val);
  185.       virtual void lowrpn(int channel, int val);
  186.       virtual void highrpn(int channel, int val);
  187.       virtual void pitchbendrange(int channel, int val);
  188.     virtual void noteon(int channel, int note, int vel);
  189.     virtual void noteoff(int channel, int note, int vel);
  190.     virtual void pitchbend(int channel, int val);
  191.     virtual void polyaftertouch(int channel, int note, int val);
  192.     virtual void aftertouch(int channel, int val);
  193.     virtual void songpos(unsigned pos);
  194.     virtual void songselect(unsigned char song);
  195.     virtual void tunerequest();
  196.     virtual void timingclock();
  197.     virtual void start();
  198.     virtual void cont();
  199.     virtual void stop();
  200.     virtual void activesense();
  201.     virtual void sysex(int syslen, unsigned char* sysdata);
  202.     // these are special sysex events:
  203.       virtual void xgreset();
  204.       virtual void gmreset();
  205.       virtual void gsreset();
  206.       virtual void gsexit();
  207.  
  208.   virtual void endmidi(); // after last track
  209.   virtual void error(const char* msg);
  210.   virtual void warning(const char* msg);
  211.  
  212.   virtual void percent(int perc);
  213.  
  214.   int getchannel() { return curchannel_; }
  215.   void setchannel(int channel);
  216.  
  217.   static const char* progname(int n, int channel);
  218.   static const char* notename(unsigned char note);
  219.  
  220.   int options_;
  221.  
  222.   int version_, tracks_, unitsperbeat_, trackno_;
  223.  
  224.   void seek(long pos);
  225.   int getbyte();
  226.   unsigned getword();
  227.   unsigned long gettri();
  228.   unsigned long getlong();
  229.   unsigned long getdelta();
  230.   unsigned char* get(int len);
  231.   virtual unsigned char* need(int nbytes);
  232.  
  233.   unsigned long microsec(unsigned long units, unsigned long msperbeats);
  234.   long units(unsigned long microsec, unsigned long msperbeats);
  235.  
  236.   // use scanchannel only at start of track!
  237.   int scanchannel(unsigned long maxlen); // channel 0-15 or -1=no channel or -2=multichannels
  238.  
  239.   // use sysevent only directly after reading F0 or F7
  240.   int scansysevent(unsigned long maxlen);
  241.  
  242. protected:
  243.   unsigned char buf_[MIDI_BUFSIZE];
  244.   int buflen_, bufpos_;
  245.   int curchannel_;
  246.   unsigned long curunit_;
  247.   unsigned long curms_, currest_;
  248.   unsigned long timediv_; // 1000 * quarterunits_
  249.   unsigned long microsecperbeat_;
  250.   int percent_;
  251.   int lastcode_;
  252.   unsigned long tracklen_;
  253.   char skiptrack_; // set to 1 if want abort runtrack
  254.  
  255.   long pos_, curpos_;
  256.   unsigned char curdeltalen_; // number of bytes read by recent getdelta() call
  257.  
  258.   void calctime(unsigned long units, unsigned long& nextms, unsigned long& nextrest);
  259.   unsigned long calcunit(unsigned long ms, unsigned long msrest = 0);
  260.  
  261. };
  262.  
  263. class MidiWrite
  264. {
  265. public:
  266.   static const char* copyright();
  267.  
  268.   MidiWrite(const char* filename);
  269.   virtual ~MidiWrite();
  270.  
  271.   FILE* getf();
  272.  
  273.   long getcurpos() { return curpos_; }
  274.   long getcurunit() { return curunit_; }  // midi units
  275.   long getcurdelta() { return curdelta_; }
  276.   void cleardelta();
  277.   int trackcount();
  278.  
  279.   void head(int version = 1, int tracks = 0, unsigned unitperbeat = 192);
  280.   void track();
  281.   void endtrack();
  282.  
  283.   void event(int what, int len, unsigned char* data);
  284.  
  285.   void text(int what, int len, unsigned char* txt);
  286.   void meta(int what, int len, unsigned char* data); // 0xff ....
  287.   virtual void prefixchannel(unsigned char channel);
  288.   virtual void prefixport(unsigned char port);
  289.   virtual void seqnumber(unsigned int seqno);
  290.   virtual void smpteofs(int hour, int min, int sec, int frame, int fracframe);
  291.   virtual void key(int signature, int isminor);
  292.   void tact(int nom, int denom, int v1, int v2);
  293.   void tempo(unsigned long microsecperbeat);
  294.   void end();
  295.   void program(int channel, int prg);
  296.   void control(int channel, int what, int val);
  297.   // these are special controls
  298.     void highbank(int channel, int val);
  299.     void wheel(int channel, int val);
  300.     void breath(int channel, int val);
  301.     void foot(int channel, int val);
  302.     void portamentotime(int channel, int val);
  303.     void data(int channel, int val);
  304.     void volume(int channel, int val);
  305.     void balance(int channel, int val);
  306.     void expression(int channel, int val);
  307.     void lowbank(int channel, int val);
  308.     void hold(int channel, int val);
  309.     void reverb(int channel, int val);
  310.     void chorus(int channel, int val);
  311.     void datainc(int channel, int val);
  312.     void datadec(int channel, int val);
  313.     void lowrpn(int channel, int val);
  314.     void highrpn(int channel, int val);
  315.     void pitchbendrange(int channel, int halfnotes);
  316.  
  317.   void noteon(int channel, int note, int vel);
  318.   void noteoff(int channel, int note, int vel = 0);
  319.   void time(unsigned long ticks);
  320.   void pitchbend(int channel, int val);
  321.   void polyaftertouch(int channel, int note, int val);
  322.   void aftertouch(int channel, int val);
  323.   void songpos(unsigned pos);
  324.   void songselect(unsigned char song);
  325.   void tunerequest();
  326.   void timingclock();
  327.   void start();
  328.   void cont();
  329.   void stop();
  330.   void activesense();
  331.   void sysex(int syslen, unsigned char* sysdata);
  332.   void xgreset();
  333.   void gmreset();
  334.   void gsreset();
  335.   void gsexit();
  336.  
  337.   void putbyte(unsigned char val);
  338.   void putcode(unsigned char code);
  339.   void putword(unsigned val);
  340.   void puttri(unsigned long val);
  341.   void putlong(unsigned long val);
  342.   void putdelta(unsigned long val);
  343.   void puttime();
  344.   void put(int len, unsigned char* c);
  345.   void seek(long pos);
  346.  
  347.   virtual void error(const char* msg);
  348.   virtual void warning(const char* msg);
  349.  
  350.   int unitsperquarter();
  351.  
  352. protected:
  353.   const char *midiname_;
  354.   FILE* f_;
  355.   long trackpos_, curpos_, filesize_;
  356.   int trackchannel_, trackcount_, lastcode_, endtrack_;
  357.  
  358.   unsigned char buf_[MIDI_BUFSIZE];
  359.   int bufpos_, buflen_;
  360.  
  361.   unsigned long curdelta_;
  362.   unsigned long curunit_;
  363.   int unitsperbeat_;
  364.  
  365.   void flush();
  366. };
  367.  
  368.  
  369. class MidiCopy : public MidiRead
  370. {
  371. public:
  372.   MidiCopy(const char* filename, FILE* f = 0);
  373.  
  374.   void setoutput(MidiWrite* dest);
  375.   void stopoutput();
  376.   MidiWrite* getoutput();
  377.  
  378.   void mapchannel(int channel, int newchannel);
  379.   void ignorechannel(int channel);
  380.  
  381.   virtual void head(unsigned version, unsigned tracks, unsigned unitperbeat);
  382.   virtual void track(int trackno, long length, int channel);
  383.   virtual void endtrack(int trackno);
  384.  
  385.   virtual void time(unsigned long ticks);
  386.  
  387.   virtual void event(int what, int len = 0, unsigned char* data = 0);
  388.  
  389.   virtual void meta(int what, int len, unsigned char* data);
  390.     virtual void text(int what, int len, char* whattext, unsigned char* txt);
  391.     virtual void end();
  392.     virtual void prefixchannel(unsigned char channel);
  393.     virtual void prefixport(unsigned char port);
  394.     virtual void seqnumber(unsigned int seqno);
  395.     virtual void smpteofs(int hour, int min, int sec, int frame, int fracframe);
  396.     virtual void tact(int nom, int denom, int unitsperbeat, int notes32perbeat);
  397.     virtual void tempo(unsigned long microsecperbeat);
  398.     virtual void key(int signature, int isminor); // C=0, -7=7flats +7=7sharps
  399.   virtual void program(int channel, int prg);
  400.   virtual void control(int channel, int what, int val);
  401.     virtual void highbank(int channel, int val);
  402.     virtual void wheel(int channel, int val);
  403.     virtual void breath(int channel, int val);
  404.     virtual void foot(int channel, int val);
  405.     virtual void portamentotime(int channel, int val);
  406.     virtual void data(int channel, int val);
  407.     virtual void volume(int channel, int val);
  408.     virtual void balance(int channel, int val);
  409.     virtual void expression(int channel, int val);
  410.     virtual void lowbank(int channel, int val);
  411.     virtual void hold(int channel, int val);
  412.     virtual void reverb(int channel, int val);
  413.     virtual void chorus(int channel, int val);
  414.     virtual void datainc(int channel, int val);
  415.     virtual void datadec(int channel, int val);
  416.     virtual void noteon(int channel, int note, int vel);
  417.     virtual void noteoff(int channel, int note, int vel);
  418.   virtual void pitchbend(int channel, int val);
  419.   virtual void polyaftertouch(int channel, int note, int val);
  420.   virtual void aftertouch(int channel, int val);
  421.   virtual void songpos(unsigned pos);
  422.   virtual void songselect(unsigned char song);
  423.   virtual void tunerequest();
  424.   virtual void timingclock();
  425.   virtual void start();
  426.   virtual void cont();
  427.   virtual void stop();
  428.   virtual void activesense();
  429.   virtual void sysex(int syslen, unsigned char* sysdata);
  430.     virtual void gmreset();
  431.     virtual void gsreset();
  432.     virtual void gsexit();
  433.     virtual void xgreset();
  434.  
  435. protected:
  436.   MidiWrite* dest_;
  437.   int mapchannel_[16];  // channel 0-15 or events are ignored for invalid channel
  438. };
  439.  
  440. class MidiSerial : public MidiRead
  441. {
  442. public:
  443.   MidiSerial(const char* filename, FILE* f = 0, char preload = 0);
  444.   virtual ~MidiSerial();
  445.  
  446.   virtual int run(); // fire events in order of time
  447.  
  448. protected:
  449.   long *trackpos_;
  450.   long *trackendpos_;
  451.   long *tracktime_;
  452.   char *trackready_;
  453.   int  *trackstatus_;
  454.  
  455.   void clear();
  456.  
  457.   void track(int trackno, long length, int channel);
  458.   void endtrack(int trackno); // closing track
  459.  
  460. };
  461.  
  462. #endif
  463.